package liecai_class.day07;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Lock 锁机制 线程并发安全问题 synchronized
 *
 * synchronized的缺点:
 *  1.需要自己选定锁对象 - 麻烦！
 *  2.本质上是一个代码块，无法跨方法使用，因此无法实现在一个方法中加锁 而在另一个方法中解锁的操作
 *  3.本质上是一个代码块，无法提供更多的扩展能力
 *
 * 为了解决这些问题，JUC中提供Lock，来实现锁机制，用于替换synchronized
 */

/**
 * Lock本质上是一个对象，加锁和解锁都是方法，可以跨方法实现对锁的控制
 */
public class Demo08 {
    private static Lock lock = new ReentrantLock();
    private static boolean isServerOK = false;

    /**
     * 连接服务器
     */
    public static void netConn(){
        try {
            System.out.println("开始连接服务器...");
            if(!isServerOK){
                //连不上服务器时，把锁释放掉，使程序能够继续执行后续操作
                //可以实现，因为Lock是一个对象，解锁是一个方法，可以在其他方法中调用
                lock.unlock();
            }
            while(!isServerOK) {
                Thread.sleep(1000);
                System.out.println("尝试重连...");
            }
            System.out.println("连接成功!");
        } catch (InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                lock.lock();
                System.out.println("AAAAA");
                netConn();
                lock.unlock();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                lock.lock();
                System.out.println("CCCCC");
                netConn();
                lock.unlock();
            }
        }).start();
    }
}
